export declare type ResolutionString = string;
export interface Exchange {
  value: string;
  name: string;
  desc: string;
}
export interface DatafeedSymbolType {
  name: string;
  value: string;
}
export interface DatafeedConfiguration {
  exchanges?: Exchange[];
  supported_resolutions?: ResolutionString[];
  supports_marks?: boolean;
  supports_time?: boolean;
  supports_timescale_marks?: boolean;
  symbols_types?: DatafeedSymbolType[];
}
export declare type OnReadyCallback = (configuration: DatafeedConfiguration) => void;
export interface IExternalDatafeed {
  onReady(callback: OnReadyCallback): void;
}
export interface DatafeedQuoteValues {
  ch?: number;
  chp?: number;
  short_name?: string;
  exchange?: string;
  description?: string;
  lp?: number;
  ask?: number;
  bid?: number;
  spread?: number;
  open_price?: number;
  high_price?: number;
  low_price?: number;
  prev_close_price?: number;
  volume?: number;
  original_name?: string;
  [valueName: string]: string | number | undefined;
}
export interface QuoteOkData {
  s: 'ok';
  n: string;
  v: DatafeedQuoteValues;
}
export interface QuoteErrorData {
  s: 'error';
  n: string;
  v: object;
}
export declare type QuoteData = QuoteOkData | QuoteErrorData;
export declare type QuotesCallback = (data: QuoteData[]) => void;
export interface IDatafeedQuotesApi {
  getQuotes(symbols: string[], onDataCallback: QuotesCallback, onErrorCallback: (msg: string) => void): void;
  subscribeQuotes(symbols: string[], fastSymbols: string[], onRealtimeCallback: QuotesCallback, listenerGUID: string): void;
  unsubscribeQuotes(listenerGUID: string): void;
}
export declare type CustomTimezones =
  | 'America/New_York'
  | 'America/Los_Angeles'
  | 'America/Chicago'
  | 'America/Phoenix'
  | 'America/Toronto'
  | 'America/Vancouver'
  | 'America/Argentina/Buenos_Aires'
  | 'America/El_Salvador'
  | 'America/Sao_Paulo'
  | 'America/Bogota'
  | 'America/Caracas'
  | 'Europe/Moscow'
  | 'Europe/Athens'
  | 'Europe/Berlin'
  | 'Europe/London'
  | 'Europe/Madrid'
  | 'Europe/Paris'
  | 'Europe/Rome'
  | 'Europe/Warsaw'
  | 'Europe/Istanbul'
  | 'Europe/Zurich'
  | 'Australia/Sydney'
  | 'Australia/Brisbane'
  | 'Australia/Adelaide'
  | 'Australia/ACT'
  | 'Asia/Almaty'
  | 'Asia/Ashkhabad'
  | 'Asia/Tokyo'
  | 'Asia/Taipei'
  | 'Asia/Singapore'
  | 'Asia/Shanghai'
  | 'Asia/Seoul'
  | 'Asia/Tehran'
  | 'Asia/Dubai'
  | 'Asia/Kolkata'
  | 'Asia/Hong_Kong'
  | 'Asia/Bangkok'
  | 'Pacific/Auckland'
  | 'Pacific/Chatham'
  | 'Pacific/Fakaofo'
  | 'Pacific/Honolulu'
  | 'America/Mexico_City'
  | 'Africa/Johannesburg'
  | 'Asia/Kathmandu'
  | 'US/Mountain';
export declare type Timezone = 'UTC' | CustomTimezones;
export interface LibrarySymbolInfo {
  /**
   * Symbol Name
   */
  name: string;
  full_name: string;
  base_name?: [string];
  /**
   * Unique symbol id
   */
  ticker?: string;
  description: string;
  type: string;
  /**
   * @example "1700-0200"
   */
  session: string;
  /**
   * Traded exchange
   * @example "NYSE"
   */
  exchange: string;
  listed_exchange: string;
  timezone: Timezone;
  /**
   * Code (Tick)
   * @example 8/16/.../256 (1/8/100 1/16/100 ... 1/256/100) or 1/10/.../10000000 (1 0.1 ... 0.0000001)
   */
  pricescale: number;
  /**
   * The number of units that make up one tick.
   */
  minmov: number;
  fractional?: boolean;
  /**
   * @example Quarters of 1/32: pricescale=128, minmovement=1, minmovement2=4
   */
  minmove2?: number;
  /**
   * false if DWM only
   */
  has_intraday?: boolean;
  /**
   * An array of resolutions which should be enabled in resolutions picker for this symbol.
   */
  supported_resolutions: ResolutionString[];
  /**
   * @example (for ex.: "1,5,60") - only these resolutions will be requested, all others will be built using them if possible
   */
  intraday_multipliers?: string[];
  has_seconds?: boolean;
  /**
   * It is an array containing seconds resolutions (in seconds without a postfix) the datafeed builds by itself.
   */
  seconds_multipliers?: string[];
  has_daily?: boolean;
  has_weekly_and_monthly?: boolean;
  has_empty_bars?: boolean;
  force_session_rebuild?: boolean;
  has_no_volume?: boolean;
  /**
   * Integer showing typical volume value decimal places for this symbol
   */
  volume_precision?: number;
  data_status?: 'streaming' | 'endofday' | 'pulsed' | 'delayed_streaming';
  /**
   * Boolean showing whether this symbol is expired futures contract or not.
   */
  expired?: boolean;
  /**
   * Unix timestamp of expiration date.
   */
  expiration_date?: number;
  sector?: string;
  industry?: string;
  currency_code?: string;
}
export interface DOMLevel {
  price: number;
  volume: number;
}
export interface DOMData {
  snapshot: boolean;
  asks: DOMLevel[];
  bids: DOMLevel[];
}
export interface Bar {
  time: number;
  open: number;
  high: number;
  low: number;
  close: number;
  volume?: number;
}
export interface SearchSymbolResultItem {
  symbol: string;
  full_name: string;
  description: string;
  exchange: string;
  ticker: string;
  type: string;
}
export interface HistoryMetadata {
  noData: boolean;
  nextTime?: number | null;
}
export interface MarkCustomColor {
  color: string;
  background: string;
}
export declare type MarkConstColors = 'red' | 'green' | 'blue' | 'yellow';
export interface Mark {
  id: string | number;
  time: number;
  color: MarkConstColors | MarkCustomColor;
  text: string;
  label: string;
  labelFontColor: string;
  minSize: number;
}
export interface TimescaleMark {
  id: string | number;
  time: number;
  color: MarkConstColors | string;
  label: string;
  tooltip: string[];
}
export declare type ResolutionBackValues = 'D' | 'M';
export interface HistoryDepth {
  resolutionBack: ResolutionBackValues;
  intervalBack: number;
}
export declare type SearchSymbolsCallback = (items: SearchSymbolResultItem[]) => void;
export declare type ResolveCallback = (symbolInfo: LibrarySymbolInfo) => void;
export declare type HistoryCallback = (bars: Bar[], meta: HistoryMetadata) => void;
export declare type SubscribeBarsCallback = (bar: Bar) => void;
export declare type GetMarksCallback<T> = (marks: T[]) => void;
export declare type ServerTimeCallback = (serverTime: number) => void;
export declare type DomeCallback = (data: DOMData) => void;
export declare type ErrorCallback = (reason: string) => void;
export interface IDatafeedChartApi {
  calculateHistoryDepth?(
    resolution: ResolutionString,
    resolutionBack: ResolutionBackValues,
    intervalBack: number,
  ): HistoryDepth | undefined;
  getMarks?(
    symbolInfo: LibrarySymbolInfo,
    startDate: number,
    endDate: number,
    onDataCallback: GetMarksCallback<Mark>,
    resolution: ResolutionString,
  ): void;
  getTimescaleMarks?(
    symbolInfo: LibrarySymbolInfo,
    startDate: number,
    endDate: number,
    onDataCallback: GetMarksCallback<TimescaleMark>,
    resolution: ResolutionString,
  ): void;
  /**
   * This function is called if configuration flag supports_time is set to true when chart needs to know the server time.
   * The charting library expects callback to be called once.
   * The time is provided without milliseconds. Example: 1445324591. It is used to display Countdown on the price scale.
   */
  getServerTime?(callback: ServerTimeCallback): void;
  searchSymbols(userInput: string, exchange: string, symbolType: string, onResult: SearchSymbolsCallback): void;
  resolveSymbol(symbolName: string, onResolve: ResolveCallback, onError: ErrorCallback): void;
  getBars(
    symbolInfo: LibrarySymbolInfo,
    resolution: ResolutionString,
    rangeStartDate: number,
    rangeEndDate: number,
    onResult: HistoryCallback,
    onError: ErrorCallback,
    isFirstCall: boolean,
  ): void;
  subscribeBars(
    symbolInfo: LibrarySymbolInfo,
    resolution: ResolutionString,
    onTick: SubscribeBarsCallback,
    listenerGuid: string,
    onResetCacheNeededCallback: () => void,
  ): void;
  unsubscribeBars(listenerGuid: string): void;
  subscribeDepth?(symbolInfo: LibrarySymbolInfo, callback: DomeCallback): string;
  unsubscribeDepth?(subscriberUID: string): void;
}
